﻿using System;
using System.Collections.Generic;
using System.EnterpriseServices;
using System.Globalization;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using negocio.readOnly;
using negocio.servicios;
using negocio.entidades;

namespace web.form
{
    public partial class Proveedores : System.Web.UI.Page
    {
        private enum State { Agregar, Editar, Ver }
        private State estado;

        private readonly ProveedorService proveedorService = new ProveedorService();
        private readonly ProvinciaService provinciaService= new ProvinciaService();
        private readonly CiudadService ciudadService = new CiudadService();

        protected void Page_Load(object sender, EventArgs e)
        {
            if (!Page.IsPostBack)
            {
                panelGrilla.Visible = true;
                panelFormulario.Visible = false;
                CargarCombos();
                CargarGrilla();
            }
        }

        private void CargarGrilla()
        {
            
            List<ProveedorReadOnly> prov = proveedorService.FindAllReadOnlies(tieneBajas());
            gvProveedores.DataSource = prov;
            string[] keys = new string[1];
            keys[0] = "IdProveedor";
            gvProveedores.DataKeyNames = keys;
            gvProveedores.DataBind();
        }

        private bool tieneBajas()
        {
            bool bajas;
            if (chkCampoBaja.Checked == true)
            {
                bajas = true;
            }
            else
            {
                bajas = false;
            }
            return bajas;
        }

        private void CargarGrilla(List<ProveedorReadOnly> lista)
        {
            gvProveedores.DataSource = null;
            gvProveedores.DataSource = lista;
            string[] keys = new string[1];
            keys[0] = "IdProveedor";
            gvProveedores.DataKeyNames = keys;
            gvProveedores.DataBind();
            gvProveedores.AutoGenerateSelectButton = true;

        }


        private void CargarCombos()
        {
            cmbProvincia.DataSource = provinciaService.ObtenerTodo();
            cmbProvincia.DataTextField = "Nombre";
            cmbProvincia.DataValueField = "Id";
            cmbProvincia.DataBind();
            cmbProvincia.SelectedIndex = -1;
            cmbProvincia.Items.Insert(0, " ");

        }

        protected void cmbProvincia_SelectedIndexChanged(object sender, EventArgs e)
        {
            cmbCiudad.Enabled = true;
            cmbCiudad.DataSource = ciudadService.ObtenerPorProvincia(Convert.ToInt32(cmbProvincia.SelectedValue));
            cmbCiudad.DataTextField = "Nombre";
            cmbCiudad.DataValueField = "Id";
            cmbCiudad.DataBind();
        }

        protected void cmdAgregar_Click(object sender, EventArgs e)
        {
            Session["estado"] = State.Agregar;
            panelFormulario.Visible = true;
            panelGrilla.Visible = false;
            if (!txtRazonSocial.Enabled)
            {
                HabilitarCampos();
                btnAceptar.Visible = true;
                btnCancelar.Text = "Cancelar";
            }
            cmbCiudad.Enabled = false;
            panelID.Visible = false;
            LimpiarCampos();
            txtFechaAlta.Text = DateTime.Today.ToShortDateString();
            txtFechaAlta.ReadOnly = true;
        }

        protected void cmdEditar_Click(object sender, EventArgs e)
        {
            Session["estado"] = State.Editar;
            panelFormulario.Visible = true;
            panelGrilla.Visible = false;

            if (!txtRazonSocial.Enabled)
            {
                HabilitarCampos();
                btnAceptar.Visible = true;
                btnCancelar.Text = "Cancelar";
            }


            if (gvProveedores.SelectedDataKey != null)
            {
                Proveedor prov = proveedorService.ObtenerPorId(Convert.ToInt32(gvProveedores.SelectedDataKey.Value));
                MapProveedorToForm(prov);
                txtID.Enabled = false;
                panelID.Visible = true;
            }
            else
            {
                Show("Seleccione una fila de la grilla");
                panelFormulario.Visible = false;
                panelGrilla.Visible = true;
            }

        }

        protected void cmdVer_Click(object sender, EventArgs e)
        {
            Session["estado"] = State.Ver;
            panelFormulario.Visible = true;
            panelGrilla.Visible = false;

            DeshabilitarCampos();
            btnAceptar.Visible = false;
            btnCancelar.Text = "Volver";

            if (gvProveedores.SelectedDataKey != null)
            {
                Proveedor prov = proveedorService.ObtenerPorId(Convert.ToInt32(gvProveedores.SelectedDataKey.Value));
                cmbProvincia.SelectedValue = prov.GetCiudad().IdProvincia.ToString();
                cmbProvincia_SelectedIndexChanged(sender, e);
                cmbCiudad.SelectedValue = Convert.ToString(prov.IdCiudad);
                cmbCiudad.Enabled = false;
                MapProveedorToForm(prov);
                panelID.Visible = true;
            }
            else
            {
                Show("Seleccione una fila de la grilla");
                panelFormulario.Visible = false;
                panelGrilla.Visible = true;
            }

        }

        protected void gvProveedores_PageIndexChanging(object sender, GridViewPageEventArgs e)
        {
            gvProveedores.PageIndex = e.NewPageIndex;
            CargarGrilla();
        }


        private void DeshabilitarCampos()
        {
            txtID.Enabled = false;
            txtRazonSocial.Enabled = false;
            txtDescripcion.Enabled = false;
            txtDireccion.Enabled = false;
            txtFax.Enabled = false;
            txtFechaAlta.Enabled = false;
            txtMontoMinimo.Enabled = false;
            txtTelefono.Enabled = false;
            txtWeb.Enabled = false;
            cmbProvincia.Enabled = false;
            txtCuit.Enabled = false;
            cmbCiudad.Enabled = false;
        }

        private void LimpiarCampos()
        {
            txtID.Text = "";
            txtCuit.Text = "";
            txtDescripcion.Text = "";
            txtDireccion.Text = "";
            txtFax.Text = "";
            txtFechaAlta.Text = "";
            txtMontoMinimo.Text = "";
            txtRazonSocial.Text = "";
            txtTelefono.Text = "";
            txtWeb.Text = "";
            cmbCiudad.ClearSelection();
            cmbProvincia.ClearSelection();
            gvProveedores.SelectedIndex = -1;
        }

        private void HabilitarCampos()
        {
            txtID.Enabled = false;
            txtRazonSocial.Enabled = true;
            txtDescripcion.Enabled = true;
            txtDireccion.Enabled = true;
            txtFax.Enabled = true;
            txtFechaAlta.Enabled = false;
            txtMontoMinimo.Enabled = true;
            txtTelefono.Enabled = true;
            txtWeb.Enabled = true;
            cmbProvincia.Enabled = true;
            txtCuit.Enabled = true;
        }

        protected void btnAceptar_Click(object sender, EventArgs e)
        {
            if (EsValido())
            {
                panelFormulario.Visible = false;
                panelGrilla.Visible = true;
                Guardar();
            }
        }

        //VER RETORNA QUE YA SE INGRESO EL PROVEEDOR
        private void Guardar()
        {
            if (Page.IsValid)
            {
                if ((State)Session["estado"] == State.Agregar)
                {
                    

                    //if (!proveedorService.existePorCampoNoPk(MapFormToProveedores()))
                    if (!proveedorService.ExistePorCampoNoPk("PROVEEDOR", "CUIT", MapFormToProveedores().Cuit.ToString()))
                    {
                        proveedorService.Insertar(MapFormToProveedores());
                    }
                    else
                    {
                        Show("El proveedor ingresado existente en el sistema");
                    }
                }
                else if ((State)Session["estado"] == State.Editar)
                {
                    proveedorService.Modificar(MapFormToProveedores());
                }
            }
            CargarGrilla();
        }

        private static void Show(string message)
        {
            string cleanMessage = message.Replace("'", "\'");
            Page page = HttpContext.Current.CurrentHandler as Page;
            string script = string.Format("alert('{0}');", cleanMessage);
            if (page != null && !page.ClientScript.IsClientScriptBlockRegistered("alert"))
            {
                page.ClientScript.RegisterClientScriptBlock(page.GetType(), "alert", script, true);
            }
        }


        private Proveedor MapFormToProveedores()
        {
            Proveedor proveedor = new Proveedor();

            //FALTA EL ID DEL PROVEEDOR MOSTRAR EL PROXIMO AUTONUMERICO
            if ((State)Session["estado"] == State.Editar)
            {
                proveedor.IdProveedor = Convert.ToInt32(txtID.Text);
            }
            
            proveedor.RazonSocial = txtRazonSocial.Text;
            proveedor.FechaAlta = DateTime.Parse(txtFechaAlta.Text);
            proveedor.Cuit = txtCuit.Text;
            proveedor.Direccion = txtDireccion.Text;
            proveedor.Telefono = txtTelefono.Text;
            proveedor.Fax = txtFax.Text;
            proveedor.SitioWeb = txtWeb.Text;
            proveedor.MontoMinimo = Convert.ToInt32(txtMontoMinimo.Text);
            proveedor.Descripcion = txtDescripcion.Text;
            proveedor.IdCiudad = Convert.ToInt32(cmbCiudad.SelectedValue);

            return proveedor;
        }

        private void MapProveedorToForm(Proveedor prov)
        {
            cmbCiudad.SelectedIndex = -1;
            cmbProvincia.SelectedIndex = -1;
            txtID.Text = prov.IdProveedor.ToString();
            txtRazonSocial.Text = prov.RazonSocial;
            txtFechaAlta.Text = prov.FechaAlta.ToShortDateString();
            txtCuit.Text = prov.Cuit;
            txtDireccion.Text = prov.Direccion;
            txtTelefono.Text = prov.Telefono;
            txtFax.Text = prov.Fax;
            txtWeb.Text = prov.SitioWeb;
            txtMontoMinimo.Text = prov.MontoMinimo.ToString();
            txtDescripcion.Text = prov.Descripcion;
            cmbProvincia.SelectedValue = prov.GetCiudad().IdProvincia.ToString();
            
            cmbProvincia_SelectedIndexChanged(null, null);
            cmbCiudad.SelectedValue = prov.IdCiudad.ToString();
        }


        private bool EsValido()
        {
            return true;
        }

        protected void btnCancelar_Click(object sender, EventArgs e)
        {
            panelFormulario.Visible = false;
            panelGrilla.Visible = true;
            panelID.Visible = true;
            LimpiarCampos();
        }

        protected void cmdEliminar_Click(object sender, EventArgs e)
        {
            proveedorService.Eliminar(Convert.ToInt32(gvProveedores.SelectedValue));
            CargarGrilla();  
        }


        protected void cmdBuscarRazonSocial_Click(object sender, EventArgs e)
        {
            if (txtRazonSocialBuscar.Text != "")
            {
                List<ProveedorReadOnly> listaReadOnlies = proveedorService.ObtenerReadOnliesPorNombre(txtRazonSocialBuscar.Text);
                CargarGrilla(listaReadOnlies);
            }
        }

        protected void cmdRecargarGrilla_Click(object sender, EventArgs e)
        {
            CargarGrilla();
        }

        protected void chkCampoBaja_CheckedChanged(object sender, EventArgs e)
        {
            CargarGrilla();
        }




        //public static bool ValidaCuit(string cuit)
        //{
        //    if (cuit == null)
        //    {
        //        return false;
        //    }
        //    cuit = cuit.Replace("-", string.Empty);
        //    if (cuit.Length != 11)
        //    {
        //        return false;
        //    }
        //    else
        //    {
        //        int calculado = CalcularDigitoCuit(cuit);
        //        int digito = int.Parse(cuit.Substring(10));
        //        return calculado == digito;
        //    }
        //}

        //public static int CalcularDigitoCuit(string cuit)
        //{
        //    int[] mult = new[] { 5, 4, 3, 2, 7, 6, 5, 4, 3, 2 };
        //    char[] nums = cuit.ToCharArray();
        //    int total = 0;
        //    for (int i = 0; i < mult.Length; i++)
        //    {
        //        total += int.Parse(nums[i].ToString()) * mult[i];
        //    }
        //    var resto = total % 11;
        //    return resto == 0 ? 0 : resto == 1 ? 9 : 11 - resto;
        //}

        //protected void cvCuit_ServerValidate(object source, ServerValidateEventArgs args)
        //{
        //    args.IsValid = ValidaCuit(args.Value);
        //}


        //protected void checkBajas_CheckedChanged(object sender, EventArgs e)
        //{
        //    if (checkBajas.Checked)
        //    {
        //        CargarGrilla(empleadoService.ObtenerTodosReadOnly());
        //    }
        //    else
        //    {
        //        CargarGrilla();
        //    }
        //}
    }
}